/*
	#########################################################
	#			Verzhak										#
	#	e-mail - <verzhak@gmail.com>						#
	#########################################################
	#	Version - 0.0.2										#
	#	Date - 01.03.2009									#
	#	License - GPLv3										#
	#########################################################
*/

#ifndef GET_RSS_H
#define GET_RSS_H

// Получение ленты (собственно, get_rss - последовательно вызывает my_connect, my_iconv, my_parse)
extern char *get_rss(void);
// Получение ленты (непосредственное получение :-) ) (в ней - все сетевое взаимодействие)
extern char *my_connect(void);
// cp1251 -> utf-8 (! только для elf'а, для модуля - не работает)
extern char *my_iconv(const char *str);
// Парсит ленту в красивый список
extern char *my_parse(const char *str);
// Мой strcat
extern void my_strcat(char *str,const char* from);

/* Ограничение на количество запросов к серверу
 * Если признак конца ленты никак не получается получить, а сервер все время возвращает пустые строки
 * Поверьте на слово, бесконечный цикл в ядре - это весело. Игра "Попробуй убей меня и выгрузи модуль"
 */
#define MAX_RECV_BEFORE_CLOSE_CONNECT 10
// http-запрос к bash.org.ru
#define MSG "GET /rss/ HTTP/1.1\nHost: bash.org.ru\nUser-Agent: Mozilla/5.0\nAccept: text/html\nConnection: close\n\n"
// IP адрес bash.org'а (мне лениво программировать еще и запрос к DNS)
#define IP_ADRR "74.55.2.118"

/*############################################################################*/
/* get_rss.h одинаково используется как в модуле, так и в elf'е
 * "Крооссформатность" достигается с помощью макросов и некоторых "доопределений" */

#ifndef MODULE
/* Program definition
 * Следующие definition'ы - для elf'а */

// Размер буфера для ленты в cp1251
#define SIZE_RC 100*1024
// Размер буфера результата преобразования ленты в utf-8
#define SIZE_REZ 110*1024

#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <stdlib.h>
#include <iconv.h>
// errno.h я использовал для отладки
//#include <errno.h>

#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>

#define MALLOC malloc
#define FREE free 
#define SOCKET socket
#define CONNECT connect
#define SEND send 
#define RECV recv
#define CLOSE_SOCK close
#define INET_ATON inet_aton
#define SOCKTYPE int 
#define printk printf

#else
/*############################################################################*/
/* Module definition
 * Определения для модуля */

// См. выше
#define SIZE_RC 100*1024
// См. выше
#define SIZE_REZ 110*1024
// (SIZE_RC и SIZE_REZ совпадают, однако разведены таким образом для более удобной отладки)

#include <linux/string.h>
#include <linux/unistd.h>
#include <linux/types.h>

#include <linux/in.h>
#include <linux/ip.h>

#define MALLOC vmalloc
#define FREE vfree
#define SOCKET my_socket
#define CONNECT my_sock_connect
#define SEND my_send
#define RECV my_recv
#define CLOSE_SOCK my_close
#define INET_ATON my_inet_aton
typedef struct socket * SOCKTYPE;
typedef unsigned int socklen_t;

// Далее - переопределение функций сетевого взаимодействия

// Получение ip из строки в виде целого
extern int my_inet_aton(const char *cp,struct in_addr *inp);

// Создание сокета
extern SOCKTYPE my_socket(int domain, int type, int protocol);

// Установка связи
extern int my_sock_connect(SOCKTYPE socket, struct sockaddr *address, int address_len);

// Отправляем данные
extern ssize_t my_send(SOCKTYPE socket, const void *buffer, size_t length, int flags);

// Принимаем данные от сервера
extern ssize_t my_recv(SOCKTYPE socket, void *buffer, size_t length, int flags);

// Закрываем соединение
extern int my_close(SOCKTYPE socket);

#endif
/*############################################################################*/

#endif
